home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / cuj9205.zip / 1005114A < prev    next >
Text File  |  1992-06-02  |  2KB  |  95 lines

  1.  
  2. Listing 5
  3. ********
  4.  
  5. /*  A header file */
  6.  
  7.    struct s_number
  8.        {
  9.        int number_of_elements;
  10.        int overflow;       /* Overflow (single bit) */
  11.        int sign;           /* Sign (0 = positive, 1 = negative) */
  12.        long int element[]; /* Kept in least significant first order */
  13.        };
  14.    typedef struct s_number *NUMBER;
  15.  
  16.    NUMBER new_number(long initial_long_value);
  17.    NUMBER add_numbers(NUMBER add1, NUMBER add2);
  18.  
  19. /*  This is a short program with its use */   
  20.  
  21. main()
  22.    {
  23.    NUMBER first_number;
  24.    NUMBER second_number;
  25.    NUMBER sum;
  26.  
  27.    first_number = new_number(10000);   
  28.    second_number = new_number(10000);
  29.    sum = add_numbers(first_number, second_number);   
  30.    }
  31.  
  32. /* The routines */
  33.  
  34. NUMBER new_number(NUMBER number, long initial_long_value)
  35.    {
  36.    number = calloc(sizeof(struct s_number) + 1, 1);
  37.    if (number != NULL)
  38.        {
  39.        number->number_of_elements = 1;
  40.        number->element[0] = initial_long_value;
  41.        }
  42.    return number;
  43.    }
  44.  
  45. NUMBER add_numbers(NUMBER add1, NUMBER add2)
  46.    {
  47.    NUMBER sum;
  48.    int size_sum;    /* Size of result */
  49.    int size_count;  /* Size of smaller addend */
  50.    int i; 
  51.    int overflow;    
  52.    int sign;
  53.    int which_is_bigger;
  54.  
  55.    /* Should check for overflow here  and increase size_sum */
  56.    if (add1->number_of_elements > add2->number_of_elements)
  57.        {
  58.        size_sum = add1->number_of_elements;
  59.        size_count = add2->number_of_elements;
  60.        which_is_bigger = 1;
  61.        }
  62.    else
  63.        {
  64.        size_count = add1->number_of_elements;
  65.        size_sum = add2->number_of_elements;
  66.        which_is_bigger = 2;
  67.        }
  68.  
  69.    /* Get a place for the result */ 
  70.    sum = calloc(sizeof(struct s_number) + size_sum, 1);
  71.  
  72.    /* Do the addition - will need to check for overflow, sign, etc. */
  73.    for (i = 0; i < size_count++; i++)
  74.        {
  75.        /* Need to check for overflow  */
  76.        sum->element[i] = add1->element[i] + add2->element[i] + 
  77.            overflow;
  78.        }
  79.  
  80.    /* Do the remainder of the larger addend */
  81.    for (i = size_count; i < size_sum; i++)
  82.        {
  83.        if (which_is_bigger == 1)
  84.           sum->element[i] = add1->element[i] + overflow;
  85.        else
  86.           sum->element[i] = add2->element[i] + overflow;
  87.        overflow = 0;
  88.        }
  89.  
  90.    /* Need to test overflow of the larger addend and set sum here */
  91.  
  92.    return sum;
  93.    }
  94.  
  95.